/**
 * 测试连接并获取推理模型列表
 *
 * @returns {Promise<boolean>} 返回一个 Promise，表示连接是否成功
 */
async function reasoningEndpointConnection() {
	/**
	 * 若推理模型为系统模型，则从服务器获取链接数据
	 */
	const systemUrl = await convertUrl(reasoningEndpointUrl.value);
	/**
	 * 拼接 API 地址
	 */
	const endpoint = systemUrl + "/models";
	// 尝试发送 GET 请求到 API 地址
	try {
		// 设置状态指示器为“警告”状态（连接中）
		reasoningStatusIndicator.className = "status-indicator status-warning";
		// 更新连接状态文本
		reasoningConnectionStatusText.textContent = "连接中...";
		/**
		 * 发送 GET 请求到 API 地址
		 */
		const response = await fetch(endpoint,
			{
				// 设置请求方法为 POST
				method: "GET",
				// 启用跨域请求
				crossDomain: true,
				// 设置请求头
				headers: {
					// 设置认证信息，从页面元素中获取推理端点密钥并进行编码
					"Authorization": "Bearer " + encodeURIComponent(reasoningEndpointKey.value),
					// 设置请求体的内容类型为 JSON
					"Content-Type": "application/json",
				}
			}
		);
		// 如果响应不成功，抛出错误
		if (!response.ok) throw new Error(`地址无效: ${response.status}`);
		/**
		 * 获取 API 返回的数据 并 解析 JSON 响应数据
		 */
		const data = await response.json();
		// 检查返回数据是否为空
		if (data.data?.length == 0) throw new Error('推理模型列表为空');
		// 更新连接状态为成功
		updateReasoningConnected(true);
		// 更新下拉菜单中的模型选项
		updateReasoningModelDropdown(data.data || []);
		// 返回获取成功
		return true;
	}
	catch (error) {
		// 更新连接状态为失败
		updateReasoningConnected(false);
		// 捕获异常并显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
		// 返回获取失败
		return false;
	}
};

/**
 * 测试连接并获取嵌入模型列表
 *
 * @returns {Promise<boolean>} 返回一个 Promise，表示连接是否成功
 */
async function embeddingEndpointConnection() {
	/** 若嵌入模型为系统模型，则从服务器获取链接数据 */
	const systemUrl = await convertUrl(embeddingEndpointUrl.value);
	/** 拼接 API 地址 */
	const endpoint = systemUrl + '/models';
	// 尝试发送 GET 请求到 API 地址
	try {
		// 设置状态指示器为“警告”状态（连接中）
		embeddingStatusIndicator.className = 'status-indicator status-warning';
		// 更新连接状态文本
		embeddingConnectionStatusText.textContent = '连接中...';
		/** 发送 GET 请求到 API 地址 */
		const response = await fetch(endpoint,
			{
				// 设置请求方法为 GET
				method: 'GET',
				// 启用跨域请求
				crossDomain: true,
				// 设置请求头
				headers: {
					// 设置认证信息
					'Authorization': 'Bearer ' + encodeURIComponent(reasoningEndpointKey.value),
					// 设置请求体的内容类型为 JSON
					'Content-Type': 'application/json'
				}
			}
		);
		// 如果响应不成功，抛出错误
		if (!response.ok) throw new Error(`地址无效: ${response.status}`);
		/** 获取 API 返回的数据 并 解析 JSON 响应数据 */
		const data = await response.json();
		// 检查返回数据是否为空
		if (data.data?.length == 0) throw new Error('嵌入模型列表为空');
		// 更新连接状态为成功
		updateEmbeddingConnected(true);
		// 更新下拉菜单中的模型选项
		updateEmbeddingModelDropdown(data.data || []);
		// 加载页面内容到向量数据库
		await loadPagesIntoVectorDB();
		// 返回获取成功
		return true;
	}
	catch (error) {
		// 禁用向量数据库功能
		VectorDatabase.allowEmbedding = false;
		// 更新连接状态为失败
		updateEmbeddingConnected(false);
		// 捕获异常并显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
		// 返回获取失败
		return false;
	}
};

/**
 * 测试连接并获取视觉模型列表
 *
 * @returns {Promise<boolean>} 返回一个 Promise，表示连接是否成功
 */
async function visualEndpointConnection() {
	/**
	 * 若视觉模型为系统模型，则从服务器获取链接数据
	 */
	const systemUrl = await convertUrl(visualEndpointUrl.value);
	/**
	 * 拼接 API 地址
	 */
	const endpoint = systemUrl + '/models';
	// 尝试发送 GET 请求到 API 地址
	try {
		// 设置状态指示器为“警告”状态（连接中）
		visualStatusIndicator.className = 'status-indicator status-warning';
		// 更新连接状态文本
		visualConnectionStatusText.textContent = '连接中...';
		/**
		 * 发送 GET 请求到 API 地址
		 */
		const response = await fetch(endpoint,
			{
				// 设置请求方法为 GET
				method: 'GET',
				// 启用跨域请求
				crossDomain: true,
				// 设置请求头
				headers: {
					// 设置认证信息，从页面元素中获取视觉端点密钥并进行编码
					'Authorization': 'Bearer ' + encodeURIComponent(visualEndpointKey.value),
					// 设置请求体的内容类型为 JSON
					'Content-Type': 'application/json'
				}
			}
		);
		// 如果响应不成功，抛出错误
		if (!response.ok) throw new Error(`地址无效: ${response.status}`);
		/**
		 * 获取 API 返回的数据 并 解析 JSON 响应数据
		 */
		const data = await response.json();
		// 检查返回数据是否为空
		if (data.data?.length == 0) throw new Error('视觉模型列表为空');
		// 更新连接状态为成功
		updateVisualConnected(true);
		// 更新下拉菜单中的模型选项
		updateVisualModelDropdown(data.data || []);
		// 返回获取成功
		return true;
	}
	catch (error) {
		// 更新连接状态为失败
		updateVisualConnected(false);
		// 捕获异常并显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
		// 返回获取失败
		return false;
	}
};

/**
 * 更新推理模型下拉选择框的选项
 *
 * @param {Array} models - 模型列表，每个模型对象应包含 id 属性
 */
function updateReasoningModelDropdown(models) {
	// 清空当前下拉选择框中的所有选项
	reasoningModelDropdown.innerHTML = "";
	/**
	 * 筛选出ID不包含'text'和'embedding'的模型
	 */
	const filteredModels = models.filter(model => !(model.id.toLowerCase().includes('text') || model.id.toLowerCase().includes('embedding') || model.id.toLowerCase().includes('vl') || model.id.toLowerCase().includes('visual')));
	// 遍历筛选后的模型列表，为每个模型创建一个 option 元素并添加到下拉选择框中
	filteredModels.forEach(
		model => {
			/**
			 * 创建一个新的 option 元素
			 */
			const option = document.createElement("option");
			// 设置 option 的值为模型的 id
			option.value = model.id;
			// 设置 option 显示的文本为模型的 id
			option.textContent = model.id;
			// 将创建的 option 元素添加到下拉选择框中
			reasoningModelDropdown.appendChild(option);
		}
	);
	/**
	 * 根据配置名称从已保存的配置中获取当前配置
	 */
	const currentLunaraConfig = savedLunaraConfigs[currentConfigName];
	// 如果筛选后的模型列表不为空
	if (filteredModels.length > 0) {
		/**
		 * 查找 id 包含 'qwen3-30b-a3b' 的首选模型
		 */
		const preferredModel = filteredModels.find(model => model.id.includes('qwen3-30b-a3b'));
		/**
		 * 查找当前配置的模型是否存在于模型列表中
		 * 如果存在则使用配置的模型，否则使用首选模型，最后随机选择一个模型
		 */
		const modelToSelect = filteredModels.find(model => model.id === currentLunaraConfig?.model) || preferredModel || filteredModels[Math.floor(Math.random() * filteredModels.length)];
		// 设置下拉选择框的当前值为选中的模型ID
		reasoningModelDropdown.value = modelToSelect.id;
		// 显示已加载的可用模型数量的成功提示信息
		showSystemMessage(`可用的< 推理模型 >数量: ${filteredModels.length} 个`, "success");
	}
	// 如果模型列表为空，显示未找到可用模型的错误提示信息
	else {
		updateReasoningConnected(false);
		showSystemMessage("未找到可用的< 推理模型 >", "error")
	};
};

/**
 * 更新视觉模型下拉选择框的选项
 *
 * @param {Array} models - 模型列表，每个模型对象应包含 id 属性
 */
function updateVisualModelDropdown(models) {
	// 清空当前下拉选择框中的所有选项
	visualModelDropdown.innerHTML = "";
	/**
	 * 筛选出ID包含'vl'或者'visual'的模型
	 */
	const filteredModels = models.filter(model => model.id.toLowerCase().includes('vl') || model.id.toLowerCase().includes('visual'));
	// 遍历筛选后的模型列表，为每个模型创建一个 option 元素并添加到下拉选择框中
	filteredModels.forEach(
		model => {
			/**
			 * 创建一个新的 option 元素
			 */
			const option = document.createElement("option");
			// 设置 option 的值为模型的 id
			option.value = model.id;
			// 设置 option 显示的文本为模型的 id
			option.textContent = model.id;
			// 将创建的 option 元素添加到下拉选择框中
			visualModelDropdown.appendChild(option);
		}
	);
	/**
	 * 根据配置名称从已保存的配置中获取当前配置
	 */
	const currentLunaraConfig = savedLunaraConfigs[currentConfigName];
	// 如果筛选后的模型列表不为空
	if (filteredModels.length > 0) {
		/**
		 * 查找 id 包含 'visual-pro' 的首选模型
		 */
		const preferredModel = filteredModels.find(model => model.id.includes('visual-pro'));
		/**
		 * 查找当前配置的视觉模型是否存在于模型列表中
		 * 如果存在则使用配置的模型，否则使用首选模型，最后随机选择一个模型
		 */
		const modelToSelect = filteredModels.find(model => model.id === currentLunaraConfig?.visualModel) || preferredModel || filteredModels[Math.floor(Math.random() * filteredModels.length)];
		// 设置下拉选择框的当前值为选中的模型ID
		visualModelDropdown.value = modelToSelect.id;
		// 显示已加载的可用模型数量的成功提示信息
		showSystemMessage(`可用的< 视觉模型 >数量: ${filteredModels.length} 个`, "success");
	}
	// 如果模型列表为空，显示未找到可用模型的错误提示信息
	else {
		updateVisualConnected(false);
		showSystemMessage("未找到可用的< 视觉模型 >", "error");
	};
};

/**
 * 更新嵌入模型下拉选择框的选项
 *
 * @param {Array} models - 模型列表，每个模型对象应包含 id 属性
 */
function updateEmbeddingModelDropdown(models) {
	// 清空当前下拉选择框中的所有选项
	embeddingModelDropdown.innerHTML = "";
	/**
	 * 筛选出ID包含'text'或'embedding'的模型
	 */
	const filteredModels = models.filter(model => model.id.toLowerCase().includes('text') || model.id.toLowerCase().includes('embedding'));
	// 遍历筛选后的模型列表，为每个模型创建一个 option 元素并添加到下拉选择框中
	filteredModels.forEach(
		model => {
			/**
			 * 创建一个新的 option 元素
			 */
			const option = document.createElement("option");
			// 设置 option 的值为模型的 id
			option.value = model.id;
			// 设置 option 显示的文本为模型的 id
			option.textContent = model.id;
			// 将创建的 option 元素添加到下拉选择框中
			embeddingModelDropdown.appendChild(option);
		}
	);
	/**
	 * 根据配置名称从已保存的配置中获取当前配置
	 */
	const currentLunaraConfig = savedLunaraConfigs[currentConfigName];
	// 如果筛选后的模型列表不为空
	if (filteredModels.length > 0) {
		/**
		 * 查找 id 包含 'text-embedding' 的首选模型
		 */
		const preferredModel = filteredModels.find(model => model.id.includes('text-embedding')) || filteredModels[0];
		/**
		 * 查找当前配置的模型是否存在于模型列表中
		 * 如果存在则使用配置的模型，否则使用首选模型
		 */
		const modelToSelect = models.find(model => model.id === currentLunaraConfig?.embeddingModel) || preferredModel;
		// 设置下拉选择框的当前值为选中的模型ID
		embeddingModelDropdown.value = modelToSelect.id;
		// 显示已加载的可用模型数量的成功提示信息
		showSystemMessage(`可用的< 嵌入模型 >数量: ${filteredModels.length} 个`, "success");
	}
	// 如果模型列表为空，显示未找到可用模型的错误提示信息
	else {
		updateEmbeddingConnected(false);
		showSystemMessage("未找到可用的< 嵌入模型 >", "error");
	};
};

/**
 * 更新 API 连接状态显示
 *
 * 该函数会根据传入的连接状态，更新连接状态指示器、状态文本和测试连接按钮的样式与状态。
 * 当连接成功时，会显示连接成功的样式并禁用测试按钮；连接失败时，恢复默认样式并启用按钮。
 *
 * @param {boolean} connected - 当前是否已连接到 API，true 表示已连接，false 表示未连接
 * @param {HTMLElement} indicator - 连接状态指示器元素，用于显示连接状态的视觉标识
 * @param {HTMLElement} statusText - 连接状态文本元素，用于显示连接状态的文字描述
 * @param {HTMLElement} button - 测试连接按钮元素，用于触发连接测试操作
 */
function updateConnectionStatus(connected, indicator, statusText, button) {
	// 根据连接状态更新 UI 显示和提示信息
	if (connected) {
		// 设置连接状态指示器样式为已连接状态
		indicator.className = "status-indicator status-connected";
		// 更新连接状态文本显示为已连接
		statusText.textContent = "已连接";
		// 修改测试连接按钮样式，使用成功颜色边框表示连接成功
		button.style.border = "3px solid var(--status-218838)";
		// 禁用测试连接按钮，避免重复测试
		button.disabled = true;
	}
	else {
		// 移除按钮边框设定，恢复默认样式
		button.style.border = "";
		// 设置连接状态指示器样式为未连接状态
		indicator.className = "status-indicator status-disconnected";
		// 更新连接状态文本显示为未连接
		statusText.textContent = "未连接";
		// 启用测试连接按钮，允许用户重新测试连接
		button.disabled = false;
	}
};

/**
 * 更新嵌入模型 API 的连接状态
 *
 * 该函数会更新全局变量 `isEmbeddingConnected` 记录当前嵌入模型 API 的连接状态，
 * 并调用 `updateConnectionStatus` 函数更新对应的 UI 显示。
 *
 * @param {boolean} connected - 当前是否已连接到嵌入模型 API，true 表示已连接，false 表示未连接
 */
function updateEmbeddingConnected(connected) {
	// 更新全局连接状态变量，记录当前嵌入模型 API 的连接状态
	isEmbeddingConnected = connected;
	// 根据连接状态更新嵌入模型相关的 UI 显示和提示信息
	updateConnectionStatus(connected, embeddingStatusIndicator, embeddingConnectionStatusText, embeddingConnectionButton);
};

/**
 * 更新推理模型 API 的连接状态
 *
 * 该函数会更新全局变量 `isReasoningConnected` 记录当前推理模型 API 的连接状态，
 * 并调用 `updateConnectionStatus` 函数更新对应的 UI 显示。
 *
 * @param {boolean} connected - 当前是否已连接到推理模型 API，true 表示已连接，false 表示未连接
 */
function updateReasoningConnected(connected) {
	// 更新全局连接状态变量，记录当前推理模型 API 的连接状态
	isReasoningConnected = connected;
	// 根据连接状态更新推理模型相关的 UI 显示和提示信息
	updateConnectionStatus(connected, reasoningStatusIndicator, reasoningConnectionStatusText, reasoningConnectionButton);
};

/**
 * 更新视觉模型 API 的连接状态
 *
 * 该函数会更新全局变量 `isVisualConnected` 记录当前视觉模型 API 的连接状态，
 * 并调用 `updateConnectionStatus` 函数更新对应的 UI 显示。
 *
 * @param {boolean} connected - 当前是否已连接到视觉模型 API，true 表示已连接，false 表示未连接
 */
function updateVisualConnected(connected) {
	// 更新全局连接状态变量，记录当前视觉模型 API 的连接状态
	isVisualConnected = connected;
	// 根据连接状态更新视觉模型相关的 UI 显示和提示信息
	updateConnectionStatus(connected, visualStatusIndicator, visualConnectionStatusText, visualConnectionButton);
};
